[2016_hackover] [PWN] ping_gnop¶
Dynamic Analysis¶
$ ./ping_gnop
_ ___ _ _ ___ ___
_ __(_)_ _ __ _ / __| \| |/ _ \| _ \
| '_ \ | ' \/ _` | (_ | .` | (_) | _/
| .__/_|_||_\__, |\___|_|\_|\___/|_|
|_| |___/ simulator 3.11
o . _______ _______
\_ 0 /______//______/| @_o
/\_, /______//______/ /\
| \ | || | / |
ping> 1
pong> 1
Static Analysis¶
먼저 IDA Hexray를 이용하여 해당 프로그램의 소스를 확인해보면 다음과 같습니다.
int play()
{
char *v0; // eax@8
char *v1; // eax@8
int result; // eax@10
char v3[512]; // [sp+Bh] [bp-23Dh]@1
char v4; // [sp+20Bh] [bp-3Dh]@10
char v5; // [sp+22Bh] [bp-1Dh]@8
char *s; // [sp+22Ch] [bp-1Ch]@1
int v7; // [sp+230h] [bp-18h]@1
char *v8; // [sp+234h] [bp-14h]@7
char *v9; // [sp+238h] [bp-10h]@7
char *i; // [sp+23Ch] [bp-Ch]@1
v7 = 322423550;
printf("ping> ");
_isoc99_scanf("%511s", v3);
s = (char *)&unk_80BCEC8;
for ( i = v3; *i; ++i )
{
if ( strchr(s, *i) )
{
puts("(겸뼞째)링 삘봺);
exit(-1);
}
}
v9 = v3;
v8 = &v3[strlen(v3) - 1];
while ( v9 < v8 )
{
v5 = *v9;
v0 = v9++;
*v0 = *v8;
v1 = v8--;
*v1 = v5;
}
printf("pong> %s\n\n");
result = j_strcpy(&v4, v3);
if ( v7 != 322423550 )
{
puts("(겸뼞째)링 삘봺);
exit(-1);
}
return result;
}